package main

func main() {
	//  GMP模型原理，包括work stealing机制、hand off机制（同步系统调用）、netpoller

	/*
		GMP 模型原理
		GMP 模型是 Go 语言运行时系统中实现并发调度的核心。它由 Goroutines (G)、Machine (M) 和 Processor (P) 三个主要部分组成。

		Goroutines（G）
			Goroutine 是 Go 的轻量级线程。它是 Go 语言并发的基本单元。
			每个 Goroutine 包含其运行的状态、栈等信息。
			调度器将 Goroutine 分配到 Processor 上运行。

		Machine（M）
			M 表示操作系统线程（也可以理解为一个操作系统的工作线程），每个 M 与一个操作系统线程（通常是一个内核线程）关联。
			Go 运行时创建并管理多个 M，它们用于执行 Goroutines。这些 M 负责运行分配给它们的 Goroutine。

		Processor（P）
			P 代表 Go 语言的逻辑处理器。它是调度系统的一部分，调度和管理 Goroutine 的执行。
			每个 P 有一个本地的 Goroutine 队列。当一个 G 被调度到 P 上时，P 负责执行它。
			P 还通过与 M 进行协作来确保 Goroutine 能够顺利执行。每个 P 在系统中是有限的，通常是与 CPU 核心数相同
	*/

	/*
		Work Stealing 机制
			Work Stealing 机制是 Go 调度器中用于负载平衡的一个重要机制。它的目的是解决某些 P （逻辑处理器）负载不均匀的情况。
		工作原理：
			Work Stealing 是一种优化策略，它允许一个 P 从另一个 P 的队列中“偷”取 Goroutines 以保持平衡。
			每个 P 都有一个本地的 Goroutine 队列。默认情况下，P 只从自己的队列中获取 Goroutine 进行执行。
			当 P 执行完它本地队列中的所有 Goroutine 时，它会去尝试从其他 P 的队列中“偷取”未执行的 Goroutine，以减少空闲时间。
			这个机制有助于优化 CPU 的利用率，避免某些 P 空闲的情况下其他 P 过度拥挤的情况。
		具体流程：
			每个 P 维护一个本地队列，里面存放着待执行的 Goroutines。
			如果一个 P 的本地队列为空，它会去尝试从其他 P 的队列中偷取 Goroutine。
			被偷取的队列通常是 LIFO（后进先出） 的，即最后插入的 Goroutine 最先被取走。
			这种机制能有效地让负载分布更加均匀，提高系统吞吐量。
	*/

	/*
		Hand Off 机制（同步系统调用）
			Hand Off 机制 用于处理 Goroutine 在进行系统调用（如网络操作或文件 I/O）时的调度问题。Go 调度器采用了协作式多任务处理，其中的 Hand Off 机制主要解决 M 在执行系统调用时无法运行其他 Goroutine 的问题。

		工作原理：
			Hand Off 机制是当一个 M 进入系统调用时，将当前的 Goroutine 移交给其他 M 进行执行。
			当 M 执行系统调用时，它会通过 Hand Off 将它的工作交给其他 M，避免 M 在等待 I/O 等操作时被阻塞。
			在此过程中，Go 调度器会确保即使 M 被挂起，系统中的其他 Goroutine 仍能继续执行。

		具体流程：
			当一个 M 执行系统调用时，它会被标记为“阻塞”，并且不会再继续执行其他的 Goroutine。
			当前的 Goroutine 会被移动到其他空闲的 M 上继续执行，保证 Goroutine 的调度不中断。
			当系统调用完成后，M 会恢复并继续执行挂起的任务。
	*/

	/*
		Netpoller
			Netpoller 是 Go 调度器中的一个网络事件轮询机制，用于处理 I/O 多路复用。它是 Go 语言在处理网络请求时的重要部分，尤其是在高并发网络编程中。

		工作原理：
			Netpoller 会管理所有与网络 I/O 相关的操作，比如监听网络连接和处理 I/O 事件。
			它是一个事件驱动模型，基于操作系统提供的多路复用机制（如 epoll、kqueue 等），可以同时监听多个网络连接上的事件，并在事件发生时将其交给相应的 Goroutine 处理。
			Netpoller 通过轮询网络事件并将事件分配给 Goroutine 来避免阻塞，确保高效的并发执行。

		具体流程：
			Netpoller 会从操作系统的 I/O 多路复用机制中轮询事件（如 epoll、kqueue、select 等）。
			当事件发生时，Netpoller 会将事件分配给一个 Goroutine 进行处理。
			通过这种方式，Go 可以高效地处理大量并发的网络请求，而无需为每个请求创建一个单独的操作系统线程。
	*/
}
